/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sop_rmi;

import cliente.Usuario_Impl;
import cliente.Usuario_Int;
import java.io.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Luis Ordoñez
 */
public class Impl_Usuarios extends UnicastRemoteObject implements Int_Usuarios {

    public Impl_Usuarios() throws RemoteException
    {
    }

    @Override
    public boolean Registar_Usuario(Usuario_Int usuario) {
	
	FileWriter ficheroU = null;
        FileWriter ficheroA = null;
        PrintWriter pwU = null;
        PrintWriter pwA = null;
        try
        {
            /*se valida si el login insertado por el usuarios ya esta en uso, 
             de ser cierto se cancela la operacion de registro*/
            if(buscarUser(usuario))
            {
               return false;
            }

            else
            {
            ficheroU = new FileWriter("../src/servidor_usuarios/usuarios/users.txt",true);
            ficheroA = new FileWriter("../src/servidor_usuarios/usuarios/admins.txt",true);
            
            pwU = new PrintWriter(ficheroU);
            pwA = new PrintWriter(ficheroA);

//            for (int i = 0; i < 10; i++)
//                pw.println("Linea " + i);
            /*empieza la escritura del archivo*/
			
            
            if(usuario.getTipo().equals("admin") )
            {
                //pwA.println();
                pwA.println(usuario.getLogin());
                pwA.println(usuario.getNombre());
                pwA.println(usuario.getApellido());
                pwA.println(usuario.getNum_Ide());
                pwA.println(usuario.getPassword());
                pwA.println(usuario.getTipo());
                ficheroU.close();
                ficheroA.close();
                return true;
            }    
            if(usuario.getTipo().equals("user"))
            {
                //pwU.println();
                pwU.println(usuario.getLogin());
                pwU.println(usuario.getNombre());
                pwU.println(usuario.getApellido());
                pwU.println(usuario.getNum_Ide());
                pwU.println(usuario.getPassword());
                pwU.println(usuario.getTipo());
                ficheroU.close();
                ficheroA.close();
                return true;
            }
            else
            {
                ficheroU.close();
                ficheroA.close();
                return false;
            }
         }
		}
		catch (Exception e) {
            e.printStackTrace();
       } 
	   
//        finally {
//           try {
//           // Nuevamente aprovechamos el finally para 
//           // asegurarnos que se cierra el fichero.
//           if (null != ficheroU && null !=ficheroA)
//           { ficheroU.close();
//              ficheroA.close();
//              return true;}
//           } catch (Exception e2) {
//              e2.printStackTrace();
//           }
//        }
        return false;
    }
	public boolean buscarUser(Usuario_Int usuario)
    {
        Usuario_Impl temp1 = new Usuario_Impl();  
      
        try {
        
        File archivoU = new File("../src/servidor_usuarios/usuarios/users.txt");   // |-> se establecen la dirrecion de los archivos para ubicar
        File archivoA = new File("../src/servidor_usuarios/usuarios/admins.txt");  // |   a los usuarios existentes.
        FileReader frU = new FileReader(archivoU);
        FileReader frA = new FileReader(archivoA);
        BufferedReader brU = new BufferedReader(frU);
        BufferedReader brA = new BufferedReader(frA);
        String lineaU,lineaA;
        String login = usuario.getLogin();
        String pass = usuario.getPassword();
        String lin;
        int band=0;
            try {
            
                /* ciclo en el cual se escanea el achivo de usuarios para ver si 
                 el usuario se encuentra en él*/
                while((lineaU=brU.readLine())!=null)
                {
                    if(lineaU.equals(login))
                    {
                          band=1;
                        
                    }
                          
                }
                /* ciclo en el cual se escanea el achivo de usuarios para ver si 
                 el usuario  se encuentra en él*/    
                while((lineaA=brA.readLine())!=null)
                {
                    if(lineaA.equals(login))
                    {	
                        band=1;
                    }
                }
            
            
            frU.close();
            frA.close();
            if(band==1){return true;}
            
            else
                return false;
            } catch (IOException ex) {
                Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
            }     
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
       return false;
        
    }        
    
    @Override
    public Usuario_Impl Obterner_Usuario(Usuario_Int usuario) {
        
        Usuario_Impl temp1 = new Usuario_Impl();  
      
        try {
        
        File archivoU = new File("../src/servidor_usuarios/usuarios/users.txt");
        File archivoA = new File("../src/servidor_usuarios/usuarios/admins.txt");
        FileReader frU = new FileReader(archivoU);
        FileReader frA = new FileReader(archivoA);
        BufferedReader brU = new BufferedReader(frU);
        BufferedReader brA = new BufferedReader(frA);
        String lineaU,lineaA;
        String login = usuario.getLogin();
        String pass = usuario.getPassword();
       String lin;
            try {
                 /* ciclo en el cual se escanea el achivo de administradores para ver si 
                 el usuario  se encuentra en él*/
                
                while((lineaU=brU.readLine())!=null)
                {
                    if(lineaU.equals(login))
                    {
                        temp1.setLogin(lineaU);

                        lin=brU.readLine();
                        temp1.setNombre(lin);

                        lin=brU.readLine();
                        temp1.setApellido(lin);

                        lin=brU.readLine();
                        temp1.setNum_Ide(lin);

                        lin=brU.readLine();
                        temp1.setPasssword(lin);
                        

                        lin=brU.readLine();
                        temp1.setTipo(lin);
                        
                    }
                          
                }
                 /* ciclo en el cual se escanea el achivo de administradores para ver si 
                 el usuario  se encuentra en él*/
				
               
                while((lineaA=brA.readLine())!=null)
                {
                    
                       if(lineaA.equals(login))
                        {	

                            temp1.setLogin(lineaA);

                            lin=brA.readLine();
                            temp1.setNombre(lin);

                            lin=brA.readLine();
                            temp1.setApellido(lin);

                            lin=brA.readLine();
                            temp1.setNum_Ide(lin);

                            lin=brA.readLine();
                            temp1.setPasssword(lin);
                            

                            lin=brA.readLine();
                            temp1.setTipo(lin);
                        }
                    
                }
            
            
            frU.close();
            frA.close();
            return temp1;
            } catch (IOException ex) {
                Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
            }     
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
       return null;
    }

    @Override
    public boolean Eliminar_Usaurio(String login) throws RemoteException {
        
         
        ArrayList<Usuario_Impl> listaDel = new ArrayList<Usuario_Impl>();
        
        FileWriter ficheroU = null;
        FileWriter ficheroA = null;
        PrintWriter pwU = null;
        PrintWriter pwA = null;
        
        listaDel=ListarUsuarios();
        
        int i=0;
        while (i<listaDel.size())
        {    
            
            if(listaDel.get(i).getLogin().equals(login))
            {    
              listaDel.remove(i);
            }
            
            i++;

        }
        try {
        ficheroU = new FileWriter("../src/servidor_usuarios/usuarios/users.txt");
        ficheroA = new FileWriter("../src/servidor_usuarios/usuarios/admins.txt");
        

        pwU = new PrintWriter(ficheroU);
        pwA = new PrintWriter(ficheroA);
        i=0;
        while (i<listaDel.size())
        {    
                        
          if(listaDel.get(i).getTipo().equals("admin") )
            {
                pwA.println(listaDel.get(i).getLogin());
                pwA.println(listaDel.get(i).getNombre());
                pwA.println(listaDel.get(i).getApellido());
                pwA.println(listaDel.get(i).getNum_Ide());
                pwA.println(listaDel.get(i).getPassword());
                pwA.println(listaDel.get(i).getTipo());
                
            }    
            if(listaDel.get(i).getTipo().equals("user"))
            {
                pwU.println(listaDel.get(i).getLogin());
                pwU.println(listaDel.get(i).getNombre());
                pwU.println(listaDel.get(i).getApellido());
                pwU.println(listaDel.get(i).getNum_Ide());
                pwU.println(listaDel.get(i).getPassword());
                pwU.println(listaDel.get(i).getTipo());
                
            }
            
        i++;

        }
        ficheroU.close();
        ficheroA.close();
        return true;
        } catch (IOException ex) {
            Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
        return false;
    
   
       
    }

    @Override
    public ArrayList<Usuario_Impl> ListarUsuarios() throws RemoteException {
        
         
        ArrayList<Usuario_Impl> lista = new ArrayList<Usuario_Impl>();
        
        
        try {
        
        File archivoU = new File("../src/servidor_usuarios/usuarios/users.txt");
        File archivoA = new File("../src/servidor_usuarios/usuarios/admins.txt");
        FileReader frU = new FileReader(archivoU);
        FileReader frA = new FileReader(archivoA);
        BufferedReader brU = new BufferedReader(frU);
        BufferedReader brA = new BufferedReader(frA);
        String lineaU,lineaA;
       
       String lin;
            try {
                 /* ciclo en el cual se escanea el achivo de administradores para ver si 
                 el usuario  se encuentra en él*/
                
                while((lineaU=brU.readLine())!=null)
                {
			Usuario_Impl temp1 = new Usuario_Impl();
                        temp1.setLogin(lineaU);

                        lin=brU.readLine();
                        temp1.setNombre(lin);

                        lin=brU.readLine();
                        temp1.setApellido(lin);

                        lin=brU.readLine();
                        temp1.setNum_Ide(lin);

                        lin=brU.readLine();
                        temp1.setPasssword(lin);                        

                        lin=brU.readLine();
                        temp1.setTipo(lin);
                        
                        lista.add(temp1);
                        
                    
                          
                }
                 /* ciclo en el cual se escanea el achivo de administradores para ver si 
                 el usuario  se encuentra en él*/
                while((lineaA=brA.readLine())!=null)
                {
                            Usuario_Impl temp1 = new Usuario_Impl();
                            temp1.setLogin(lineaA);

                            lin=brA.readLine();
                            temp1.setNombre(lin);

                            lin=brA.readLine();
                            temp1.setApellido(lin);

                            lin=brA.readLine();
                            temp1.setNum_Ide(lin);

                            lin=brA.readLine();
                            temp1.setPasssword(lin);
                            

                            lin=brA.readLine();
                            temp1.setTipo(lin);
                        
                            lista.add(temp1);
                    
                }
            
            
            frU.close();
            frA.close();
			
			        
        return lista;
      } catch (IOException ex) {
                Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
            }     
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
       return null;
    }

    @Override
    public boolean Actualizar_Usuario(Usuario_Int usuario) throws RemoteException {
        
        ArrayList<Usuario_Impl> listaUp = new ArrayList<Usuario_Impl>();
        
        FileWriter ficheroU = null;
        FileWriter ficheroA = null;
        PrintWriter pwU = null;
        PrintWriter pwA = null;
        listaUp=ListarUsuarios();
        
        int i=0;
        while (i<listaUp.size())
        {    
            
            if(listaUp.get(i).getLogin().equals(usuario.getLogin()))
            {    
              listaUp.get(i).setNombre(usuario.getNombre()); 
              listaUp.get(i).setApellido(usuario.getApellido()); 
              listaUp.get(i).setNum_Ide(usuario.getNum_Ide()); 
              listaUp.get(i).setPasssword(usuario.getPassword()); 
              listaUp.get(i).setTipo(usuario.getTipo()); 

            }
            
            i++;

        }
        try {
        ficheroU = new FileWriter("../src/servidor_usuarios/usuarios/users.txt");
        ficheroA = new FileWriter("../src/servidor_usuarios/usuarios/admins.txt");
        

        pwU = new PrintWriter(ficheroU);
        pwA = new PrintWriter(ficheroA);
        i=0;
        while (i<listaUp.size())
        {    
                        
          if(listaUp.get(i).getTipo().equals("admin") )
            {
                pwA.println(listaUp.get(i).getLogin());
                pwA.println(listaUp.get(i).getNombre());
                pwA.println(listaUp.get(i).getApellido());
                pwA.println(listaUp.get(i).getNum_Ide());
                pwA.println(listaUp.get(i).getPassword());
                pwA.println(listaUp.get(i).getTipo());
                
            }    
            if(listaUp.get(i).getTipo().equals("user"))
            {
                pwU.println(listaUp.get(i).getLogin());
                pwU.println(listaUp.get(i).getNombre());
                pwU.println(listaUp.get(i).getApellido());
                pwU.println(listaUp.get(i).getNum_Ide());
                pwU.println(listaUp.get(i).getPassword());
                pwU.println(listaUp.get(i).getTipo());
                
            }
            
        i++;

        }
        ficheroU.close();
        ficheroA.close();
        return true;
        } catch (IOException ex) {
            Logger.getLogger(Impl_Usuarios.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
        return false;
    }
   
}
